/**
 * 跳转类型枚举
 * NavigateTo: 页面跳转，保留当前页面
 * RedirectTo: 页面重定向，关闭当前页面
 * SwitchTab: 切换 tabBar 页面
 * ReLaunch: 重新启动应用，关闭所有页面
 */
type JumpType = "NavigateTo" | "RedirectTo" | "SwitchTab" | "ReLaunch";

/**
 * 路由跳转选项配置
 * 组合了uni-app各种页面跳转方式的选项配置
 */
export type NextOptions = {
    /** 目标页面路径 */
    url: string;
    /** 跳转类型 */
    jumpType?: JumpType;
} & UniNamespace.NavigateToOptions &
    UniNamespace.RedirectToOptions &
    UniNamespace.SwitchTabOptions &
    UniNamespace.ReLaunchOptions;

/**
 * 路由守卫前置钩子函数参数配置
 */
type BeforeEnterOptions = {
    /** 继续路由跳转的回调函数，可传入跳转配置 */
    next: (route?: NextOptions) => void;
    /** 来源路由信息 */
    from: UniNamespace.NavigateToOptions;
    /** 目标路由信息 */
    to: UniNamespace.NavigateToOptions;
};

/** 路由守卫前置钩子函数类型定义 */
type BeforeEnterFn = (options: BeforeEnterOptions) => void;

/**
 * 路由配置项
 */
export type RoutesType = {
    /** 路由路径 */
    path: string;
    /** 路由名称（可选） */
    name?: string;
    /** 是否需要登录权限（可选） */
    isNeedLogin?: boolean;
    /** 路由前置守卫函数（可选） */
    beforeEnter?: BeforeEnterFn;
};

/**
 * @description 路由创建选项配置
 */
export type CreateRouterOptions = {
    /** 路由配置数组 */
    routes: RoutesType[];
};

/**
 * 创建路由实例
 * @param options 路由创建选项配置
 * @returns 路由配置对象
 */
export const createRouter = (options: CreateRouterOptions) => {
    return options;
};
